#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int gval = 100; // 全局变量，用于演示父子进程的数据独立性

int main() {
    // 打印父进程初始信息
    //printf("父进程开始运行, pid: %d\n", getpid());
    while(1)
    {
      sleep(1);
    }

//    // 调用fork()创建子进程
//    pid_t id = fork(); // fork()返回值：
//                       // >0 表示父进程，返回值为子进程PID
//                       // =0 表示子进程
//                       // <0 表示创建失败
//
//    if (id < 0) {
//        // fork失败处理
//        perror("fork"); // 打印错误信息（如资源不足）
//        return 1;
//    } 
//    else if (id == 0) {
//        // 子进程代码块
//        printf("我是子进程! pid: %d, 父进程pid: %d, gval: %d\n", 
//               getpid(), getppid(), gval); // getppid()获取父进程ID
//
//        sleep(5); // 故意延迟5秒，便于观察进程关系
//
//        while (1) {
//            sleep(1);
//            // 子进程修改自己的gval副本（父进程的gval不受影响）
//            printf("子进程修改变量: %d->%d\n", gval, gval + 10);
//            gval += 10; // 写时复制(Copy-On-Write)实际发生在此处
//            printf("子进程当前状态: pid=%d, ppid=%d\n", getpid(), getppid());
//        }
//    } 
//    else {
//        // 父进程代码块
//        while (1) {
//            sleep(1);
//            // 父进程的gval始终保持初始值
//            printf("我是父进程! pid: %d, 父进程pid: %d, gval: %d\n", 
//                   getpid(), getppid(), gval);
//        }
//    }
//
//    // 注意：由于前面有while(1)，此代码实际不会执行
//    printf("进程结束, pid: %d\n", getpid()); 
    return 0;
}
